package cn.angis.system.excel;

import cn.angis.common.annotation.ExcelDictItem;
import cn.angis.system.service.DictService;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
import org.apache.commons.lang3.StringUtils;
import org.noear.solon.Solon;

import java.lang.reflect.Field;
import java.text.ParseException;

/**
 * 包名称：cn.angis.common.excel
 * 类名称：ExcelDictConverter
 * 类描述：Excel Converter字典转换器
 * 创建人：@author frank
 * 创建日期： 2024年04月01日
 */
public class ExcelDictConverter implements Converter<String> {
    public ExcelDictConverter() {
    }

    @Override
    public Class supportJavaTypeKey() {
        return null;
    }

    @Override
    public CellDataTypeEnum supportExcelTypeKey() {
        return null;
    }

    /**
     * 将excel单元格数据转换成对象属性值   name-->code
     *
     * @param cellData             单元格的数据
     * @param excelContentProperty excel每一行的数据内容
     * @param globalConfiguration  global全局配置
     * @return 转换后的对象属性值
     * @throws Exception 异常
     */
    @Override
    public String convertToJavaData(ReadCellData<?> cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws ParseException {
        // 获取字典类型
        Field field = excelContentProperty.getField();
        ExcelDictItem excel = field.getAnnotation(ExcelDictItem.class);
        String dictType = excel.type();

        // 为空返回
        String dictLabel = cellData.getStringValue();
        if (StringUtils.isBlank(dictLabel)) {
            return dictLabel;
        }
        return Solon.app().context().getBean(DictService.class).getValueByLabel(dictType, dictLabel);
    }


    /**
     * 将对象属性值转换成excel单元格数据 code-->name
     *
     * @param dictValue            对象的属性值
     * @param excelContentProperty excel每一行的数据内容
     * @param globalConfiguration  global全局配置
     * @return 转换后的对象属性值
     * @throws Exception 异常
     */
    @Override
    public WriteCellData<?> convertToExcelData(String dictValue, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) {
        // 获取字典类型
        Field field = excelContentProperty.getField();
        ExcelDictItem excel = field.getAnnotation(ExcelDictItem.class);
        String dictType = excel.type();
        // 为空返回
        if (StringUtils.isBlank(dictValue)) {
            return new WriteCellData(dictValue);
        }
        return new WriteCellData(Solon.app().context().getBean(DictService.class).getLabelByValue(dictType, dictValue));
    }
}
